{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Event Recommendation Engine Challenge"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "#保存数据\n",
    "import pickle\n",
    "\n",
    "import itertools\n",
    "\n",
    "#处理事件字符串\n",
    "import datetime\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import scipy.io as sio\n",
    "import scipy.sparse as ss\n",
    "\n",
    "#相似度/距离\n",
    "import scipy.spatial.distance as ssd\n",
    "\n",
    "from collections import defaultdict\n",
    "from sklearn.preprocessing import normalize"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 抽取出只在训练集和测试集中出现的event"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class '_io.BufferedReader'>\n",
      "<class '_io.BufferedReader'>\n",
      "number of uniqueEvents :13418\n"
     ]
    }
   ],
   "source": [
    "# 统计训练集中有多少不同的用户的events\n",
    "uniqueEvents = set()\n",
    "\n",
    "#倒排表\n",
    "#统计每个用户参加的活动   / 每个活动参加的用户\n",
    "eventsForUser = defaultdict(set)\n",
    "usersForEvent = defaultdict(set)\n",
    "    \n",
    "for filename in [\"train.csv\", \"test.csv\"]:\n",
    "    f = open(filename, 'rb')\n",
    "    print(type(f))\n",
    "    #忽略第一行（列名字）\n",
    "    f.readline().strip().decode('utf-8').split(\",\")\n",
    "    #print(type(f))\n",
    "    for line in f:    #对每条记录\n",
    "        cols = line.strip().decode('utf-8').split(\",\")\n",
    "        uniqueEvents.add(cols[1])   #第二列为活动ID\n",
    "        \n",
    "        #eventsForUser[cols[0]].add(cols[1])    #该用户参加了这个活动\n",
    "        #usersForEvent[cols[1]].add(cols[0])    #该活动被用户参加\n",
    "    f.close()\n",
    "\n",
    "n_uniqueEvents = len(uniqueEvents)\n",
    "\n",
    "print(\"number of uniqueEvents :%d\" % n_uniqueEvents)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "#读取event数据\n",
    "new_events=[]\n",
    "index=0\n",
    "f = open('events.csv', 'rb')\n",
    "columns=f.readline().strip().decode('utf-8').split(\",\")\n",
    "for line in f:\n",
    "    cols = line.strip().decode('utf-8').split(\",\")\n",
    "    if cols[0] in uniqueEvents:\n",
    "        new_events.append(cols)\n",
    "        index=index+1\n",
    "f.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([['684921758', '3647864012', '2012-10-31T00:00:00.001Z', ..., ' 0',\n",
       "        ' 0', '9'],\n",
       "       ['244999119', '3476440521', '2012-11-03T00:00:00.001Z', ..., ' 0',\n",
       "        ' 0', '7'],\n",
       "       ['3928440935', '517514445', '2012-11-05T00:00:00.001Z', ..., ' 0',\n",
       "        ' 0', '12'],\n",
       "       ...,\n",
       "       ['3409015015', '1019195677', '2012-09-28T21:00:00.003Z', ...,\n",
       "        ' 0', ' 0', '10'],\n",
       "       ['3119357029', '3318624521', '2012-10-31T00:00:00.001Z', ...,\n",
       "        ' 0', ' 0', '6'],\n",
       "       ['2736696425', '3264288794', '2012-10-26T03:00:00.003Z', ...,\n",
       "        ' 0', ' 0', '132']], dtype='<U40')"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "new_events=np.array(new_events)\n",
    "new_events\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "submission = pd.DataFrame(data=new_events,index=range(0,index),columns=columns)\n",
    "submission.to_csv('new_events.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Unnamed: 0</th>\n",
       "      <th>event_id</th>\n",
       "      <th>user_id</th>\n",
       "      <th>start_time</th>\n",
       "      <th>city</th>\n",
       "      <th>state</th>\n",
       "      <th>zip</th>\n",
       "      <th>country</th>\n",
       "      <th>lat</th>\n",
       "      <th>lng</th>\n",
       "      <th>...</th>\n",
       "      <th>c_92</th>\n",
       "      <th>c_93</th>\n",
       "      <th>c_94</th>\n",
       "      <th>c_95</th>\n",
       "      <th>c_96</th>\n",
       "      <th>c_97</th>\n",
       "      <th>c_98</th>\n",
       "      <th>c_99</th>\n",
       "      <th>c_100</th>\n",
       "      <th>c_other</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>684921758</td>\n",
       "      <td>3647864012</td>\n",
       "      <td>2012-10-31T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>244999119</td>\n",
       "      <td>3476440521</td>\n",
       "      <td>2012-11-03T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>3928440935</td>\n",
       "      <td>517514445</td>\n",
       "      <td>2012-11-05T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>2582345152</td>\n",
       "      <td>781585781</td>\n",
       "      <td>2012-10-30T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>1051165850</td>\n",
       "      <td>1016098580</td>\n",
       "      <td>2012-09-27T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 111 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Unnamed: 0    event_id     user_id                start_time city state  \\\n",
       "0           0   684921758  3647864012  2012-10-31T00:00:00.001Z  NaN   NaN   \n",
       "1           1   244999119  3476440521  2012-11-03T00:00:00.001Z  NaN   NaN   \n",
       "2           2  3928440935   517514445  2012-11-05T00:00:00.001Z  NaN   NaN   \n",
       "3           3  2582345152   781585781  2012-10-30T00:00:00.001Z  NaN   NaN   \n",
       "4           4  1051165850  1016098580  2012-09-27T00:00:00.001Z  NaN   NaN   \n",
       "\n",
       "   zip country  lat  lng   ...     c_92  c_93  c_94  c_95  c_96  c_97  c_98  \\\n",
       "0  NaN     NaN  NaN  NaN   ...        0     1     0     0     0     0     0   \n",
       "1  NaN     NaN  NaN  NaN   ...        0     0     0     0     0     0     0   \n",
       "2  NaN     NaN  NaN  NaN   ...        0     0     0     0     0     0     0   \n",
       "3  NaN     NaN  NaN  NaN   ...        0     0     0     0     0     0     0   \n",
       "4  NaN     NaN  NaN  NaN   ...        0     0     0     0     0     0     0   \n",
       "\n",
       "   c_99  c_100  c_other  \n",
       "0     0      0        9  \n",
       "1     0      0        7  \n",
       "2     0      0       12  \n",
       "3     0      0        8  \n",
       "4     0      0        9  \n",
       "\n",
       "[5 rows x 111 columns]"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "new_events=pd.read_csv('new_events.csv')\n",
    "new_events.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 13418 entries, 0 to 13417\n",
      "Columns: 111 entries, Unnamed: 0 to c_other\n",
      "dtypes: float64(2), int64(104), object(5)\n",
      "memory usage: 11.4+ MB\n"
     ]
    }
   ],
   "source": [
    "new_events.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 聚类 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [],
   "source": [
    "#读取训练数据\n",
    "n_trains = 6000\n",
    "X_train = new_events.drop([\"Unnamed: 0\",\"event_id\",\"user_id\",\"start_time\",\"city\",\"state\",\"zip\",\"country\",\"lat\",\"lng\"],axis=1).values[:n_trains]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "the shape of train_image: (6000, 101)\n"
     ]
    }
   ],
   "source": [
    "# 原始输入的特征维数和样本数目\n",
    "print('the shape of train_image: {}'.format(X_train.shape))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [],
   "source": [
    "#特征归一化\n",
    "from sklearn import preprocessing\n",
    "n_train_x= preprocessing.Normalizer()\n",
    "X_train = n_train_x.fit_transform(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(6000, 20)\n"
     ]
    }
   ],
   "source": [
    "#对数据进行PCA降维\n",
    "from sklearn.decomposition import PCA\n",
    "pca = PCA(n_components=0.75)\n",
    "pca.fit(X_train)\n",
    "\n",
    "X_train_pca = pca.transform(X_train)\n",
    "\n",
    "# 降维后的特征维数\n",
    "print(X_train_pca.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(copy=True, iterated_power='auto', n_components=0.75, random_state=None,\n",
       "  svd_solver='auto', tol=0.0, whiten=False)"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 将训练集合拆分成训练集和校验集，在校验集上找到最佳的模型超参数（PCA的维数）\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val = train_test_split(X_train_pca,train_size = 0.8,random_state = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(4800, 20)\n",
      "(1200, 20)\n"
     ]
    }
   ],
   "source": [
    "#拆分后的训练集和校验集的样本数目\n",
    "print(X_train_part.shape)\n",
    "print(X_val.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 一个参数点（聚类数据为K）的模型，在校验集上评价聚类算法性能\n",
    "from sklearn.cluster import MiniBatchKMeans\n",
    "import time\n",
    "from sklearn import metrics\n",
    "def K_cluster_analysis(K, X_train, X_val):\n",
    "    start = time.time()\n",
    "    \n",
    "    print(\"K-means begin with clusters: {}\".format(K));\n",
    "    \n",
    "    #K-means,在训练集上训练\n",
    "    mb_kmeans = MiniBatchKMeans(n_clusters = K)\n",
    "    mb_kmeans.fit(X_train)\n",
    "\n",
    "    # K值的评估标准\n",
    "    #常见的方法有轮廓系数Silhouette Coefficient和Calinski-Harabasz Index\n",
    "    #这两个分数值越大则聚类效果越好\n",
    "    #CH_score = metrics.calinski_harabaz_score(X_train,mb_kmeans.predict(X_train))\n",
    "    CH_score = metrics.silhouette_score(X_train,mb_kmeans.predict(X_train))\n",
    "    \n",
    "    end = time.time()\n",
    "    print(\"CH_score: {}, time elaps:{}\".format(CH_score, int(end-start)))\n",
    "    \n",
    "    return CH_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K-means begin with clusters: 5\n",
      "CH_score: 0.2524460678061598, time elaps:1\n",
      "K-means begin with clusters: 10\n",
      "CH_score: 0.25874371945095215, time elaps:1\n",
      "K-means begin with clusters: 15\n",
      "CH_score: 0.18038062750693626, time elaps:1\n",
      "K-means begin with clusters: 20\n",
      "CH_score: 0.10234114165161862, time elaps:1\n",
      "K-means begin with clusters: 25\n",
      "CH_score: 0.12766344845178798, time elaps:1\n",
      "K-means begin with clusters: 30\n",
      "CH_score: 0.13120959540159297, time elaps:1\n",
      "K-means begin with clusters: 35\n",
      "CH_score: 0.15171167240378775, time elaps:1\n",
      "K-means begin with clusters: 40\n",
      "CH_score: 0.12908709155883655, time elaps:1\n",
      "K-means begin with clusters: 45\n",
      "CH_score: 0.12028273908660833, time elaps:1\n",
      "K-means begin with clusters: 50\n",
      "CH_score: 0.09649496533400789, time elaps:1\n",
      "K-means begin with clusters: 55\n",
      "CH_score: 0.10719700865328981, time elaps:2\n",
      "K-means begin with clusters: 60\n",
      "CH_score: 0.12823899735644637, time elaps:2\n",
      "K-means begin with clusters: 65\n",
      "CH_score: 0.13181485017586433, time elaps:1\n",
      "K-means begin with clusters: 70\n",
      "CH_score: 0.09165298147572325, time elaps:2\n",
      "K-means begin with clusters: 75\n",
      "CH_score: 0.15062629371952954, time elaps:2\n",
      "K-means begin with clusters: 80\n",
      "CH_score: 0.1366857316498554, time elaps:2\n"
     ]
    }
   ],
   "source": [
    "# 设置超参数（聚类数目K）搜索范围\n",
    "Ks = [5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80]\n",
    "CH_scores = []\n",
    "for K in Ks:\n",
    "    ch = K_cluster_analysis(K, X_train_part, X_val)\n",
    "    CH_scores.append(ch)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x17a5c00b3c8>]"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x17a5c26a128>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制不同PCA维数下模型的性能，找到最佳模型／参数（分数最高）\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "plt.plot(Ks, np.array(CH_scores), 'b-')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[5 5 6 ... 6 0 6]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x17a3b5526a0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#显示聚类结果\n",
    "#画出聚类结果，每一类用一种颜色\n",
    "colors = ['+b','+g','+r','+k','+c','+m','+y','+w']\n",
    "\n",
    "n_clusters = 8\n",
    "mb_kmeans = MiniBatchKMeans(n_clusters = n_clusters)\n",
    "mb_kmeans.fit(X_train_pca)\n",
    "\n",
    "y_train_pred = mb_kmeans.labels_\n",
    "print(y_train_pred)\n",
    "cents = mb_kmeans.cluster_centers_#质心\n",
    "plt.figure(figsize=(8,5))\n",
    "for i in range(n_clusters):\n",
    "    index = np.nonzero(y_train_pred==i)[0]\n",
    "    x1 = X_train_pca[index,0]\n",
    "    x2 = X_train_pca[index,1]\n",
    "    plt.plot(x1,x2,colors[i],marker='.',markersize=10)\n",
    "   # plt.scatter(cents[i,0],cents[i,1],marker='x',color=colors[i],linewidths=12)\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "效果并不好，不同类混在一块"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
